package controllers.GestionTratamientoDatos.Metodos.Correccion.Metodos;

import controllers.GestionTratamientoDatos.Metodos.Correccion.MetodoCorreccionBase;
import models.Hidregistro;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: Daniel
 * Date: 07/02/13
 * Time: 12:28 PM
 * To change this template use File | Settings | File Templates.
 */
public class InterpolacionLineal extends MetodoCorreccionBase {

    public InterpolacionLineal(List<Hidregistro> serieEntrada, int intervaloDias) {
        super(serieEntrada, intervaloDias);
    }

    @Override
    public void Corregir()
    {
        DeterminarDatosCorregidos();
    }

    public List<Hidregistro> Interpolar(Hidregistro hidregistroInicio, Hidregistro hidregistroFin, int numeroDatosInterpolados)
    {
        List<Hidregistro> hidregistros = new ArrayList<Hidregistro>();
        Date fechaTemporal = (Date)hidregistroInicio.getRegfech().clone();

        for (int i = 0; i < numeroDatosInterpolados; i++)
        {
            double DX1 = i + 1;
            double DX2 = numeroDatosInterpolados + 1;
            double Y1 = hidregistroInicio.getRegval();
            double Y2 = hidregistroFin.getRegval();
            double DY = Y2 - Y1;
            double Y = (DX1 / DX2) * DY + Y1;

            fechaTemporal = ObtenerFechaMasIntervalo(fechaTemporal);

            Hidregistro hidregistro = new Hidregistro(0,hidregistroInicio.getHidtipomedicion(), hidregistroInicio.getHidtiporegistro(),
                                                      hidregistroInicio.getHidpuntomonitoreo(), fechaTemporal, Y, new Date(),
                                                      hidregistroInicio.getRegtipmet(), hidregistroInicio.getRegestval());
            hidregistros.add(hidregistro);
        }
        return hidregistros;
    }

    public void DeterminarDatosCorregidos()
    {
        List<Hidregistro> hidregistros = new ArrayList<Hidregistro>();

        for (int i = 0; i < getSerieEntrada().size() - 1; i++)
        {
            Date fechaInicio = getSerieEntrada().get(i).getRegfech();
            Date fechaFin = getSerieEntrada().get(i +  1).getRegfech();

            int numeroDatosInterpolados = RestaFecha(fechaInicio, fechaFin);

            Hidregistro hidregistro1 = new Hidregistro(0,getSerieEntrada().get(i).getHidtipomedicion(), getSerieEntrada().get(i).getHidtiporegistro(),
                    getSerieEntrada().get(i).getHidpuntomonitoreo(), getSerieEntrada().get(i).getRegfech(), getSerieEntrada().get(i).getRegval(),
                    new Date(), 1, 2);
            Hidregistro hidregistro2 = getSerieEntrada().get(i + 1);

            hidregistros.add(hidregistro1);
            if(numeroDatosInterpolados < 5)
            {
                List<Hidregistro> hidregistrosInterpolar = Interpolar(hidregistro1, hidregistro2, numeroDatosInterpolados - 1);

                for (int j = 0; j < hidregistrosInterpolar.size(); j++)
                {
                    hidregistros.add(hidregistrosInterpolar.get(j));
                }
            }
        }

        Hidregistro hidregistro = getSerieEntrada().get(getSerieEntrada().size() - 1);
        Hidregistro hidregistro1 = new Hidregistro(0,hidregistro.getHidtipomedicion(), hidregistro.getHidtiporegistro(), hidregistro.getHidpuntomonitoreo(),
                                                   hidregistro.getRegfech(), hidregistro.getRegval(),new Date(), 1, 2);
        hidregistros.add(hidregistro1);

        setSerieSalida(hidregistros);
    }

}
